/* 
 Game 游戏类
 @map 地图
 @food 食物
 @snake 蛇
 */
function Game(map, food, snake) {
    this.map = map;
    this.food = food;
    this.snake = snake;

    //计时器
    this.timer = null;
    
    //是否开始游戏了
    this.play = true;
    
    // 初始化
    this.init();
}

// 初始化
Game.prototype.init = function() {
    // 渲染地图格子到页面
    this.map.fill();
    // 把食物渲染到地图里
    this.renderFood();
    // 把蛇渲染到地图里
    this.renderSnake();
    // 开始游戏
      this.start();
    // 监听方向键
    this.eventKey();
}


// 把食物渲染到地图里
Game.prototype.renderFood = function() {
    //渲染食物就是给指定方格渲染背景颜色
    // console.log(this.map.dom);
    // 获取到食物的row
    let row = this.food.row;
    // 获取到食物的col
    let col = this.food.col;
    // 给地图里创建的dom标签加背景颜色
    // this.map.dom.childNodes[row].childNodes[col].style.background = "red";
    //精简childNodes部分的代码
    this.map.arr[row][col].style.background = "url('img/food.png')";
    this.map.arr[row][col].style.backgroundSize = "cover";
}


// 把蛇渲染到地图里
Game.prototype.renderSnake = function() {
    for (let i = 0; i < this.snake.arr.length; i++) {
        //获取到蛇的单节身体的row
        let row = this.snake.arr[i].row;
        //获取到蛇的单节身体的col
        let col = this.snake.arr[i].col;
        // 给地图里的dom标签添加背景颜色
        // this.map.dom.childNodes[row].childNodes[col].style.background = "green";
        // 精简
        // 分离蛇头蛇尾蛇身
        let p;
        if(i === 0){
            p = "snake";
        }else if(i === this.snake.arr.length - 1){
            p = "head";
        }else{
            p = "body";
        }
        this.map.arr[row][col].style.background = "url(img/"+p+".png)";
        
        //根据蛇的移动方向决定蛇头的旋转反向(左37 右39 下40 上38)
        let d;
        if(this.snake.direction === 37){
            d = 90;
        }else if(this.snake.direction === 38){
            d = 0;
        }else if(this.snake.direction === 39){
            d = 90;
        }else if(this.snake.direction === 40){
            d = -180;
        }
        this.map.arr[row][col].style.transform = "rotate("+d+"deg)";
        this.map.arr[row][col].style.backgroundSize = "cover";
    }
}


// 游戏开始
Game.prototype.start = function() {
    // console.log(this);
    //执行计时器 每秒执行1次
    this.timer = setInterval(() => {
        // console.log(this);
        //移动蛇
        this.snake.move();
        //蛇撞墙
        this.checkMap();
        //检测蛇是否吃到了自己
        this.checkSnake();
        //判断蛇头是否吃到食物
        this.checkFood();
        //检测游戏是否在运行
        if(this.play){
            //清屏
            this.map.clear();
            //渲染食物
            this.renderFood();
            //渲染蛇
            this.renderSnake();
        }
        
    }, 400)
}



// 监听方向键
Game.prototype.eventKey = function() {
    // 按下键盘的时候触发的事件
    // console.log(this)
    document.onkeydown = (e) => {
        // console.log(this)
        let code = e.keyCode;
        // console.log(code);
        if (code === 37 || code === 38 || code === 39 || code === 40) {
            //执行snake里面的修改方向的函数
            this.snake.change(code);
        }
    }
}


// 判断蛇是否吃到食物
Game.prototype.checkFood = function() {
    // 获取食物位置
    let food = this.food;
    // 获取蛇头的位置
    let head = this.snake.arr[this.snake.arr.length - 1];

    // 判断当前蛇头的位置是否与食物重合
    if (head.row === food.row && head.col === food.col) {
        console.log("蛇头吃到食物了");
        //1 蛇的尾巴增加一节
        this.snake.grow();
        //2 食物的位置随机更新
        this.changeFood();
//       分数
		var score=document.getElementById('fen')
		var sc=parseInt(score.value)+1;
		score.value=sc;
    }
}

// 食物的位置随机更新
Game.prototype.changeFood = function() {
    //随机生成食物坐标
    let row = parseInt(Math.random() * this.map.x);
    let col = parseInt(Math.random() * this.map.y);

    // 循环蛇的数组
    for (let i = 0; i < this.snake.arr.length; i++) {
        // 找到蛇的每一节身体
        let s = this.snake.arr[i];
        if (s.row === row && s.col === col) {
            console.log("重合了");
            // 如果if判断成立，就说明生成的食物与身体冲突了 - 重新生成一遍
            this.changeFood();
            //跳出
            return;
        }
    }

    //更新食物的方法
    this.food.change(row, col);
}


// 检测蛇是否吃到了自己
Game.prototype.checkSnake = function() {
    //获取蛇的头部
    let head = this.snake.arr[this.snake.arr.length - 1];

    //for循环蛇的每一节身体
    for (let i = 0; i < this.snake.arr.length - 1; i++) {
        //获取到蛇的每一节身体
        let s = this.snake.arr[i];
        if (s.row === head.row && s.col === head.col) {
            console.log("蛇头撞到自己的身体了");
            //调用游戏结束
            this.gameOver();
        }
    }
}

// 检测蛇是否撞墙
Game.prototype.checkMap = function(){
    //找到蛇头
    let head = this.snake.arr[this.snake.arr.length - 1];
    //与墙的四个边缘做对比
    if(head.col < 0 || head.row < 0 || head.col >= this.map.y || head.row >= this.map.x){
        //代表撞墙
        this.gameOver();
    }
}


// 游戏结束
Game.prototype.gameOver = function() {
    //play
    this.play = false;
    //停止计时器
    clearInterval(this.timer);
    //弹窗告知
    alert("游戏结束");
}